package qj.app.srt;

import java.io.File;
import java.io.OutputStream;
import java.util.LinkedList;
import java.util.List;

import qj.srt.Srt;
import qj.util.FileUtil;
import qj.util.IOUtil;
import qj.util.StringChange;
import qj.util.funct.F0;
import qj.util.funct.F2;
import qj.util.funct.Fs;
import qj.util.funct.P1;

public class SrtTranslateFix {
	public static void main(String[] args) {
		LinkedList<F2<String, String, List<StringChange>>> fixes = new LinkedList<F2<String, String, List<StringChange>>>();
		fixes.add(fix("Earth","Trái đất","Thổ"));
		fixes.add(fix("Fire","lửa","Hoả"));
		fixes.add(fix("Long ago","Long trước đây","Rất lâu trước đây"));
		fixes.add(fix("Fire Nation","Quốc lửa","Hoả Quốc"));
		fixes.add(fix("his airbending\r?\nskills","airbending của mình\r?\nkỹ năng","kỹ năng airbending của anh ấy"));
		fixes.add(fix("has a lot to learn","có rất nhiều để tìm hiểu","phải học rất nhiều"));
		fixes.add(fix("save anyone","tiết kiệm bất cứ ai","cứu bất cứ ai"));
		fixes.add(fix("Avatar State","Nhà nước Avatar","Trạng thái Avatar"));
		fixes.add(fix("Avatar State","Avatar Nhà nước","Trạng thái Avatar"));
		fixes.add(fix("Master","Thạc sĩ","Sư phụ"));
		fixes.add(fix("Earth Kingdom","Anh Thổ","Thổ Quốc"));
		fixes.add(fix("General","Tổng","Tướng"));
		fixes.add(fix("Fire Lord","Chúa cháy","Hoả Vương"));
//		fixes.add(fix("Fire","AAA","CCCC"));
//		fixes.add(fix("Fire","AAA","CCCC"));
//		fixes.add(fix("Fire","AAA","CCCC"));
		
		F2<String,String,String> fixer = chain(fixes);
		
		
		File from = new File("/Users/quanle/Downloads/274249");
		File to = new File("/Users/quanle/Downloads/274249/vi");
		File fix = new File("/Users/quanle/Downloads/274249/fix");
		for (File fromFile : from.listFiles()) {
			if (fromFile.isDirectory() || fromFile.getName().startsWith(".")) {
				continue;
			}
			OutputStream fileFix = FileUtil.fileOutputStream(new File(fix, fromFile.getName()));
			P1<Srt> fixAccept = Srt.writer(fileFix);
			File toFile = new File(to,fromFile.getName());
			F0<Srt> nextTo = Srt.reader(FileUtil.fileInputStream(toFile));
//			int count = 0;
			for (Srt fromSrt : Fs.iterable(Srt.reader(FileUtil.fileInputStream(fromFile)))) {
				Srt toSrt = nextTo.e();
				toSrt.text = fixer.e(fromSrt.text, toSrt.text);
				fixAccept.e(toSrt);
//				System.out.println(fromSrt.text + " ==> " + toSrt.text);
//				count++;
//				if (count==10) {
//					System.exit(0);
//				}
			}
			IOUtil.close(fileFix);
//			System.exit(0);
		}
	}

	private static F2<String, String, String> chain(
			final LinkedList<F2<String, String, List<StringChange>>> fixes) {
		return new F2<String, String, String>() {public String e(String from, String to) {
			LinkedList<StringChange> allChanges = new LinkedList<StringChange>();
			for (F2<String, String, List<StringChange>> fix : fixes) {
				List<StringChange> changes = fix.e(from, to);
				if (changes!=null) {
					allChanges.addAll(changes);
				}
			}
			return StringChange.apply(allChanges, to);
		}};
	}

	private static F2<String, String, List<StringChange>> fix(final String appear, final String replaceFrom, final String replaceTo) {
		return new F2<String,String,List<StringChange>>() {public List<StringChange> e(String from, String to) {
			if (from.contains(appear)) {
				return StringChange.replaceAll(replaceFrom, replaceTo, to);
			}
			return null;
		}};
	}
}
